Запись и получение данных в словаре¶
В этом руководстве показано, как записать в словарь данные, а затем получить запись из базы данных с обогащением из словаря. Для примера используется база данных с категориями денежных трат.
Права доступа к кластеру и словарям
В этом примере для подключения к кластеру и выполнения операций со словарями используется пользователь admin с ролью super. Роль здесь – это набор прав, которые могут быть предоставлены пользователю. Роль super дает полный набор административных прав.
Если требуется ограничить права пользователя, работающего со словарем, можно задать для этого отдельного пользователя. Такой пользователь имеет доступ только к вызову методов API словарей, а также выгрузке и загрузке данных через утилиту tt ClI. Пример работы с таким пользователем описан в разделе Работа со словарём с ограниченными правами.
Содержание:
Пререквизиты¶
Для выполнения примера требуются:
установленный Docker-образ Tarantool DB;
приложение Docker Compose;
утилита tt CLI;
исходные файлы примера
dictionary.Примечание
Есть два способа получить исходные файлы примера:
Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива:
tarantooldb-documentation-3.0.0.tar.gz. Примерdictionaryрасположен в таком архиве в директории./doc/examples/dictionary/.Отдельный архив dictionary.tar.gz, скачанный c сайта Tarantool.
Запуск стенда и подключение к узлу¶
Для успешного запуска должны быть свободны следующие порты:
2379
3301–3308
8081
Перейдите в папку с примером dictionary:
cd ./doc/examples/dictionary
Запустите стенд:
make start
Команда развернет стенд, который состоит из:
кластера Tarantool DB:
2 роутера;
2 набора реплик по 3 хранилища;
кластера etcd из 3 узлов;
1 узла Tarantool Cluster Manager (TCM).
После запуска должны работать все контейнеры, кроме init_host.
Также после запуска кластера становится доступен веб-интерфейс TCM. Для входа в TCM откройте в браузере адрес http://localhost:8081. Логин и пароль для входа:
Username:
adminPassword:
secret
В TCM откройте вкладку Stateboard.
Выберите в наборе реплик storage-1 узел storage-1-msk и в открывшемся окне перейдите на вкладку Terminal.
Во вкладке Terminal проверьте наличие спейсов money_moves, dictionary_data и dictionary_vclock:
box.space
Узнать больше о спейсе dictionary_data можно в разделе Начало работы с модулем dictionary.
Запись данных в словарь¶
Чтобы начать работу с базой данных через интерактивную консоль Tarantool, нужно подключиться к узлу кластера. Сделать это можно двумя способами:
в веб-интерфейсе TCM;
в терминале с помощью утилиты tt CLI:
tt connect admin:secret-cluster-cookie@localhost:3301
Подключитесь к роутеру router-msk, используя первый способ – через TCM. Для этого:
Перейдите на вкладку Stateboard.
Нажмите на набор реплик
router-msk.Выберите узел
router-mskи в открывшемся окне перейдите на вкладку Terminal.
В примере ниже задается словарь с названием categories, который содержит категории денежных трат.
Для записи элементов с соответствующими им ключами в словарь используется метод dictionary_router_set().
Примечание
Tarantool DB 3.x поддерживает как новый формат названий методов dictionary API (dictionary_router_get()), так и старый (dictionary_router.get()).
Методы, добавленные в версии Tarantool DB 2.x и выше, поддерживают оба формата названий.
Вызвать метод в новом формате через tt CLI или в TCM во вкладке Terminal (TT Connect)
можно через box.schema.func.call, например:
box.schema.func.call('dictionary_router_set', 'categories', '1', 'Shops')
Вызвать метод в старом формате можно напрямую, например:
dictionary_router.set('categories', '1', 'Shops')
Во вкладке Terminal с помощью метода dictionary_router_set() запишите несколько элементов (Shops, Food delivery и другие) с соответствующими им ключами в словарь:
box.schema.func.call('dictionary_router_set', 'categories', '1', 'Shops')
box.schema.func.call('dictionary_router_set', 'categories', '2', 'Food delivery')
box.schema.func.call('dictionary_router_set', 'categories', '3', 'Transport')
box.schema.func.call('dictionary_router_set', 'categories', '4', 'Bills')
box.schema.func.call('dictionary_router_set', 'categories', '5', 'Med')
Примечание
Ключ элемента в словаре может быть только строкой.
Чтобы проверить записанные в словарь данные, используйте метод dictionary_router_get():
box.schema.func.call('dictionary_router_get', 'categories', '1')
Подготовка нормализованных данных¶
Чтобы записать нормализованные данные, выполните во вкладке Terminal следующий код:
crud.replace('money_moves', {1, box.NULL, 123, require('datetime').now(), '1', false, 260.01})
crud.replace('money_moves', {2, box.NULL, 123, require('datetime').now(), '2', false, 1234.56})
crud.replace('money_moves', {2, box.NULL, 123, require('datetime').now(), '3', false, 30})
crud.replace('money_moves', {3, box.NULL, 123, require('datetime').now(), '5', false, 1176.12})
crud.replace('money_moves', {4, box.NULL, 123, require('datetime').now(), '3', false, 30})
crud.replace('money_moves', {5, box.NULL, 123, require('datetime').now(), '3', false, 35})
crud.replace('money_moves', {6, box.NULL, 123, require('datetime').now(), '4', false, 11816.86})
crud.replace('money_moves', {7, box.NULL, 123, require('datetime').now(), '3', false, 218})
crud.replace('money_moves', {8, box.NULL, 123, require('datetime').now(), '1', false, 1026.45})
crud.replace('money_moves', {9, box.NULL, 123, require('datetime').now(), '1', false, 384.32})
crud.replace('money_moves', {10, box.NULL, 123, require('datetime').now(), '2', false, 890.99})
Проверьте записанные данные, используйте метод crud.get():
crud.get('money_moves', 1)
Чтение данных с обогащением из словаря¶
Чтобы получить запись с добавленной информацией из словаря, выполните во вкладке Terminal следующую команду:
box.schema.func.call('get_money_move', 1)
Остановка стенда¶
Чтобы остановить стенд, выполните в локальном терминале следующую команду:
make stop